import http from '@/api';
import dayjs from 'dayjs';
import { setFormMethods } from '../form/setForm';
/**
 * 设置表格的列相关配置
 * @returns
 */
export const setColumns = async (json, tableData, configPageParams) => {
  if (!json?.columns || !json?.columns?.length) {
    elMessage('没有表格列配置', 'error');
    return;
  }

  await setOptions(json);

  transitionColumnsSearch(json, configPageParams);

  tableData.columns = json.columns.map(item => {
    // 删除没有type的列  不删除会导致如果数据中有children属性，这种树结构的表格无法显示子数据
    // 问题在proTable组件，这个问题后面看下要不要修复
    // 目前暂时对没有type的属性直接删除，这样是可以正常显示的
    if (!item.type) {
      delete item.type;
    }
    return item;
  });
  // console.log(tableData.columns, 'tableData.columns');
};

/**设置数据字典相关数据 */
const setOptions = async json => {
  // 字典code
  const dictCodes = [];

  const enumOptions = new Map();

  // api接口相关配置
  const enumApiData = [];
  const apis = [];

  for (let item of json.columns) {
    // 静态属性直接设置children
    if (item?.enumProps) {
      if (item.enumProps.type === 'options') {
        if (item.enumProps.options) {
          enumOptions.set(item.prop, JSON.parse(item.enumProps.options));
        }
      } else if (item.enumProps.type === 'dict') {
        dictCodes.push(item);
      } else if (item.enumProps.type === 'api') {
        enumApiData.push(item);
        const { type, url, data } = item.enumProps || {};
        apis.push(() => http[type](url, data || {}));
      }
    }
    if (item?.search?.defaultValueType === 'number' && item?.search?.defaultValue) {
      item.search.defaultValue = parseFloat(item?.search?.defaultValue);
    }
  }

  // 对api请求进行统一的处理
  if (apis.length) {
    const resArr = await Promise.all(apis.map(v => v()));
    for (let i = 0; i < enumApiData.length; i++) {
      const item = enumApiData[i];
      const { prop } = item || {};
      const { label, value } = item.enumProps || {};
      enumOptions.set(prop, arrTransitionSelectData(resArr[i], label, value));
    }
  }

  if (dictCodes.length) {
    const code = dictCodes.map(item => item.enumProps.dictCode);
    // 统一获取数据字典值
    const dictObj: any = await getDictionaryListByCodes(code);
    for (let item of dictCodes) {
      const { prop } = item || {};
      const { label, value, dictCode } = item.enumProps || {};
      enumOptions.set(prop, arrTransitionSelectData(dictObj[dictCode], label, value));
    }
  }
  for (let item of json?.columns) {
    if (item?.enumProps) {
      item.enum = enumOptions.get(item.prop);
    }
  }
};

/**设置查询 */
const transitionColumnsSearch = (json, configPageParams) => {
  for (let item of json.columns) {
    const defaultValue = item?.search?.defaultValue || '';

    // 日期格式直接进行转换

    if (defaultValue && typeof defaultValue === 'string' && defaultValue.includes('dayjs')) {
      const f = new Function('dayjs', defaultValue);
      item.search.defaultValue = f(dayjs);
    }

    setFormMethods(item.search, configPageParams);
  }
};
